home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-05 / pcb121.zip / MEMORY.INC < prev    next >
Text File  |  1992-01-23  |  6KB  |  176 lines

  1. ;;******************************************************************************
  2. ;;                         memory.inc      memory.inc
  3. ;;******************************************************************************
  4. ;;
  5. ;;  Copyright (C) 1990 Vance Morrison
  6. ;;
  7. ;;
  8. ;; Permission to view, compile, and modify for LOCAL (intra-organization) 
  9. ;; USE ONLY is hereby granted, provided that this copyright and permission 
  10. ;; notice appear on all copies.  Any other use by permission only.
  11. ;;
  12. ;; Vance Morrison makes no representations about the suitability 
  13. ;; of this software for any purpose.  It is provided "as is" without expressed 
  14. ;; or implied warranty.  See the copywrite notice file for complete details.
  15. ;;
  16. ;;******************************************************************************
  17. ;; 
  18. ;; In order to do fast 16 bit transfers between cards with shared memory
  19. ;; we need to tell each card that it can use all 16 bits.  Unforunately,
  20. ;; we can't leave this on all the time (because this bit is shared among
  21. ;; hardward that may want it unasserted).  Thus before each transfer, the
  22. ;; source and destination card need to be places in 16 bit mode.
  23. ;;
  24. ;; Because in PCroute determining the destination card is difficult, and
  25. ;; since it is unlikely that there will be configurations with a mix
  26. ;; of 8 and 16 bit shared memory cards, we take a simplified view.  
  27. ;; Namely if any 8 bit shared memory boards exist, everyone does 8 bit
  28. ;; transfers all the time.  If all boards are 16 bit, then before any copy, 
  29. ;; all cards are placed in 16 bit mode.   ZZ
  30.  
  31. ;; of networking cards is not transparent (at least not with the WD8013EBT).
  32. ;; because of this, we need to toggle 16bit mode when it is necessary
  33. ;; (it is also necessary to do this with interupts disabled, which also
  34. ;; requires special processing).  memory.inc provides functions that allow
  35. ;; this toggling to be done automatically.  
  36. ;;
  37. ;;******************************************************************************
  38. ;;
  39. ;; functions provided by this module are
  40. ;;
  41. ;;   MEM_DECLARE_16BIT on_macro, off_macro
  42. ;;   MEM_DECLARE_8BIT 
  43. ;;   MEM_DECLARE_NEED_INTS lantency 
  44. ;;   MEM_COPY_in_CX_SI_DI_ES_out_SI_DI_const_AX_BX_DX_BP_ES  
  45. ;;
  46. ;;******************************************************************************
  47.  
  48. mem_num_16bit = 0
  49. mem_num_8bit = 0
  50. mem_min_latency = -1
  51.  
  52.  
  53. ;;******************************************************************************
  54. ;;  MEM_DECLARE_16BIT declares the fact that a 16 bit shared memory card 
  55. ;;  exists in the system.  'on_macro' turns 16 bit mode on for that card`
  56. ;;  'off_macro' turns it off.  Interfaces that use main memory for buffering
  57. ;;  need not be declared.  Note that on and off macros CAN ONLY MODIFY
  58. ;;  THE AX AND DX REGISTERS.  'id' is a number passed to the on  and off 
  59. ;;  macros when they are called.
  60.     
  61. MEM_DECLARE_16BIT MACRO on_macro, off_macro, id
  62.  
  63.     mem_num_16bit = mem_num_16bit + 1
  64.  
  65.     HELPER MACRO num
  66.         mem_16bit_&&num&&_on  equ <on_macro>
  67.         mem_16bit_&&num&&_off equ <off_macro>
  68.         mem_16bit_&&num&&_id = id
  69.     ENDM
  70.  
  71.     HELPER %mem_num_16bit
  72. ENDM
  73.  
  74.  
  75. ;;******************************************************************************
  76. ;; MEM_DECLARE_NEED_INTS declares the fact that there is an interface
  77. ;; that uses interupts that need to be serviced quickly, so interupts 
  78. ;; cannot remain disabled for long times.  'lantency' is the worst case
  79. ;; latency required measured in usec.  For example a SLIP line at 19.2K
  80. ;; baud requires that interupts be serviced in 500 us.
  81. ;; 
  82.     
  83. MEM_DECLARE_NEED_INTS MACRO latency
  84.     if mem_min_latency gt latency       ;; take the minimum
  85.         mem_min_latency = latency
  86.     endif
  87. ENDM
  88.  
  89.  
  90. ;;******************************************************************************
  91. ;;  MEM_DECLARE_8BIT declares the fact that a 8 bit shared memory card 
  92. ;;  exists in the system.   In this implementation, this means don't ever
  93. ;;  use 16 bit mode at all.
  94.     
  95. MEM_DECLARE_8BIT MACRO 
  96.     mem_num_8bit = 1
  97. ENDM
  98.  
  99.  
  100. ;;******************************************************************************
  101. ;; MEM_COPY_in_CX_SI_DI_ES_out_SI_DI does the copy operation.  It requires
  102. ;; that SI and DI are EVEN.   This function is esentially a 'rep movsw'
  103. ;; with added functionality that enables 16bit bus transfers if possible.
  104. ;;
  105.  
  106. MEM_COPY_in_CX_SI_DI_ES_out_SI_DI_const_AX_BX_DX_BP_ES MACRO 
  107.     local copy_loop, done
  108.  
  109.     inc CX          
  110.     shr CX, 1
  111.     if (mem_num_8bit eq 0) and (mem_num_16bit gt 0)
  112.         push AX
  113.         push DX
  114.         if mem_min_latency lt 0
  115.             cli
  116.             MEM_ALL_16BIT_ON_const_BX_CX_BP_SI_DI_ES 
  117.             rep 
  118.             movsw
  119.             MEM_ALL_16BIT_OFF_const_BX_CX_BP_SI_DI_ES 
  120.             sti
  121.         else
  122.                 ;; really should copy in pieces, but I don't have
  123.                 ;; the time to code it.  for now we just give up 
  124.                 ;; on 16 bit access
  125.             rep
  126.             movsw
  127.         endif
  128.         pop DX
  129.         pop AX
  130.     else
  131.         rep 
  132.         movsw
  133.     endif
  134. ENDM
  135.  
  136.  
  137. ;;****************************************************************************
  138. ;; These macros call the stored on_macro and off_macro respectively
  139.  
  140. MEM_ALL_16BIT_ON_const_BX_CX_BP_SI_DI_ES MACRO
  141.     irp idx,<1,2,3,4,5,6,7,8>
  142.     if idx le mem_num_16bit
  143.         MEM_16BIT_ON_const_BX_CX_BP_SI_DI_ES idx
  144.     endif
  145.     endm
  146. ENDM
  147.  
  148. ;;****************************************************************************
  149.  
  150. MEM_ALL_16BIT_OFF_const_BX_CX_BP_SI_DI_ES MACRO
  151.     irp idx,<1,2,3,4,5,6,7,8>
  152.     if idx le mem_num_16bit
  153.         MEM_16BIT_OFF_const_BX_CX_BP_SI_DI_ES idx
  154.     endif
  155.     endm
  156. ENDM
  157.  
  158. ;;****************************************************************************
  159. MEM_16BIT_ON_const_BX_CX_BP_SI_DI_ES MACRO num
  160.     HELPER MACRO name, myid
  161.         name myid
  162.     ENDM
  163.  
  164.     HELPER %mem_16bit_&num&_on, %mem_16bit_&num&_id
  165. ENDM
  166.  
  167. ;;****************************************************************************
  168. MEM_16BIT_OFF_const_BX_CX_BP_SI_DI_ES MACRO num
  169.     HELPER MACRO name, myid 
  170.         name myid
  171.     ENDM
  172.  
  173.     HELPER %mem_16bit_&num&_off, %mem_16bit_&num&_id
  174. ENDM
  175.  
  176.